// 一个go程序只允许一个名为main的包
package main

// 这个包路径，不是包名。只是通常路径的最后一个分段名和包名一样。
// 这是go的标准库
import "fmt"

// main函数是应用的入口，但不一定是用户层面第一个被执行的函数
// init是一个特殊的函数，进行包初始化
// 无参无返回值
// 可以有多个init函数，依次执行
// 有依赖包，先进性依赖包的init
// 自动被go运行时调用，不能手工调用
func init() {
	// 执行时机是在常量和变量初始化之后，main函数之前
	// var a, s, b = 10, "haha", true
}

// main函数，程序的入口
// 不允许有参数和返回值
func main() {
	// 这里的fmt是包名
	fmt.Println("hello,world")
	// 这里可以调用是因为Println函数的首字母大写
	// 在 Go 语言中，只有首字母为大写的标识符才是导出的（Exported），才能对包外的代码可见；如果首字母是小写的，那么这个标识符仅限于在声明它的包内可见。

	// 语句最后的分号，可以忽略。go编译器会自动加上分号
}

// 第一个程序
// cd D:\github\go_learn\src\hello_world
// go build main.go
// 编译打包，会生成main.exe
// 之后可以运行

// 也可以直接使用 go run main.go运行源码

// 依赖包按“深度优先”的次序进行初始化；
// 每个包内按以“常量 -> 变量 -> init 函数”的顺序进行初始化；
// 包内的多个 init 函数按出现次序进行自动调用。
